char ssid[] = "ssid-site"; //SSID wifi site
char pwd[] = "heslo-site"; //heslo site
char ip[] = "74.125.141.103"; //IP adresa www.google.com

String cmd; //retezec pro ukladani a skladani prikazu 
String http;

void setup(){
    Serial.begin(9600);
    Serial3.begin(9600); //9600, 57600, 115200

    cmd = "AT";
    command(cmd, "Zkousim pritomnost modulu", "Modul komunikuje", "Modul nekomunikuje", "OK", 3000);

    cmd = "AT+RST";
    command(cmd, "Restartuji modul", "Modul restartovan", "Modul se nepovedlo restartovat", "ready", 5000);

    cmd = "AT+CWMODE=1";
    command(cmd, "Nastavuji klient mod", "Nastaveno", "Nepovedlo se nastavit", "OK", 2000);

    cmd = "AT+CWJAP=\"";
    cmd += ssid;
    cmd += "\",\"";
    cmd += pwd;
    cmd += "\"";
    command(cmd, "Pripojuji k WiFi", "Pripojeno", "Nelze se pripojit", "OK", 10000);
    
    cmd = "AT+CIPMUX=0";
    command(cmd, "Nastavuji jednoduche pripojeni", "Nastaveno", "Nepovedlo se nastavit", "OK", 1000);

    cmd = "AT+CIPSTART=\"TCP\",\"";
    cmd += ip;
    cmd += "\",80";
    command(cmd, "Pripojuji k zadane IP", "Pripojeno", "Nepovedlo se pripojit", "OK", 5000);
    waitFor("Linked", 1000);

    http = "GET / HTTP/1.1\r\n\r\n";
    cmd = "AT+CIPSEND=";
    cmd += http.length();
    if(command(cmd, "Posilam HTTP request", "Odeslano", "Cas spojeni vyprsel", ">", 5000)){
        Serial3.print(http); 
        Serial.println(">");
    }
    else{
        cmd = "AT+CIPCLOSE";
        command(cmd, "Ukoncuji", "Ukonceno", "", "OK", 2000);
    }
}

void loop(){
    resendData();
}

boolean command(String cmd, String comment, String success, String unsuccess, char *waitForString, long waitingTime){
    Serial.println();
    Serial.println(comment);
    Serial.println("] " + cmd);
    Serial3.println(cmd);
    boolean result = waitFor(waitForString, waitingTime);
    if(result){
        Serial.println("[ " + success);
    }
    else{
        Serial.println("[ " + unsuccess);    
    }
    resendData();

    return result;
}

boolean waitFor(char *s, long waitingTime){
    Serial3.setTimeout(waitingTime);
    return Serial3.find(s);
}

boolean resendData(){
    while(Serial.available()){
        Serial3.write(Serial.read());    
    }

    while(Serial3.available()){
        Serial.write(Serial3.read());  
    }    
}